package com.imti.recyclerviewdemo;

import android.graphics.Color;
import android.os.Bundle;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
import com.yanzhenjie.recyclerview.OnItemMenuClickListener;
import com.yanzhenjie.recyclerview.SwipeMenu;
import com.yanzhenjie.recyclerview.SwipeMenuBridge;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    //NullPointerException 空指针异常，必然出现null引用调方法，log会定位到具体某一行代码，而且Cause By描述会说明具体哪个对象引起的
    //ClassCastException 类型转换异常，极大概率因为多态使用错误，子类类型引用引用了父类类型对象，会提示具体应用类型和对象类型
    //IndexOutOfRangeException 数组越界，必然因为数组或者List等类型脚标越界，
    //可能1：数组或者List长度为0时取值，可能2：脚标超过List或者数组长度

    private void initView()
    {
        SwipeRecyclerView contactList = findViewById(R.id.contact_list);
        SmartRefreshLayout refreshLayout = findViewById(R.id.smart_refresh);

        contactList.setLayoutManager(new LinearLayoutManager(this));

        List<ContactModel> data = new ArrayList<>();
        List<ContactModel> newData = new ArrayList<>();

        for (int i = 0; i < 20; i++)
        {
            ContactModel model = new ContactModel();

            model.setContactName("张三 " + i);
            model.setContactIconResId(R.mipmap.ic_launcher);

            data.add(model);

            ContactModel newModel = new ContactModel();

            newModel.setContactName("李四 " + i);
            newModel.setContactIconResId(R.mipmap.ic_launcher);

            newData.add(newModel);
        }

        MyAdapter adapter = new MyAdapter(this);
        adapter.setData(data);

        SwipeMenuCreator menuCreator = new SwipeMenuCreator()
        {
            //参数1：左侧菜单
            //参数2：右侧菜单
            @Override
            public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int position)
            {
                SwipeMenuItem deleteItem = new SwipeMenuItem(MainActivity.this);

                //侧滑菜单项背景色
                deleteItem.setBackground(R.color.design_default_color_error);
                //设置侧滑菜单文字
                deleteItem.setText("删除");
                //设置侧滑菜单文字项颜色
                deleteItem.setTextColor(Color.WHITE);
                //设置侧滑菜单文字大小
                deleteItem.setTextSize(16);
                //设置侧滑菜单宽高
                //菜单高度需要设置为与条目高度相同，所以通常使用ViewGroup.LayoutParams.MATCH_PARENT
                deleteItem.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
                deleteItem.setWidth(160);

                //将菜单项天机到右侧菜单中
                rightMenu.addMenuItem(deleteItem);
            }
        };

        contactList.setSwipeMenuCreator(menuCreator);

        //设置菜单项点击事件
        contactList.setOnItemMenuClickListener(new OnItemMenuClickListener()
        {
            @Override
            public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition)
            {
                //判断点击是否为右侧菜单
                if (menuBridge.getDirection() == SwipeRecyclerView.RIGHT_DIRECTION)
                {
                    //根据SwipeMenuCreator创建时添加的顺序判断具体某个菜单，
                    //先添加的序号为0，之后以此类推，类似数组脚标
                    if (menuBridge.getPosition() == 0)
                    {
                        //点击时收起菜单
                        menuBridge.closeMenu();
                    }
                }
            }
        });

        //设置菜单时，不可在setAdapter()方法后调用
        contactList.setAdapter(adapter);

        //延迟自动刷新，单位ms
//        refreshLayout.autoRefresh(200);
        //延迟自动加载，单位ms
//        refreshLayout.autoLoadMore(200);

        //如果设置了刷新/加载的监听，则默认的监听收起延迟时长会消失
        //需要手动结束刷新/加载
        //单独监听刷新事件
        refreshLayout.setOnRefreshListener(new OnRefreshListener()
        {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout)
            {
                //数据和适配器之间以一一匹配，即一套List数据对一个Adapter适配器
                //无论如何刷新，数据List对象并没有发生变化，仅修改数据
                data.clear();
                data.addAll(newData);

                //无脑刷，刷新全部数据，整个RecyclerView重绘
                //当数据刷新完成后，必须通知适配器，否则适配器不会重绘复合控件
                adapter.notifyDataSetChanged();

                refreshLayout.finishRefresh(3000, true, false);
            }
        });

        //单独监听加载事件
        //移动分页使用的是增量加载，新数据会累加在老数据之上
        //分页类似书本：每一页都有最大的承载量（pageCount），每一页书都有页码(pageNum)
        //Web网页分页时使用的策略是：每次只展示当前页码的数据（书本）
        //移动端的分页策略：累加法，将新的数据持续类加载原有老数据之上（卷轴）
        refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener()
        {
            @Override
            public void onLoadMore(@NonNull RefreshLayout refreshLayout)
            {
                //累加新数据
                data.addAll(newData);
                adapter.notifyDataSetChanged();

                refreshLayout.finishLoadMore(3000, true, false);
            }
        });

        //同时监听加载和刷新
        //单独监听和同时监听不可同时使用
//        refreshLayout.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener()
//        {
//            @Override
//            public void onLoadMore(@NonNull RefreshLayout refreshLayout)
//            {
//
//            }
//            @Override
//            public void onRefresh(@NonNull RefreshLayout refreshLayout)
//            {
//
//            }
//        });
    }
}